//
//  HMOAuthViewModel.swift
//  WB25
//
//  Created by HM on 2017/7/2.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
/*
    -VM作用: 帮助OAuthVC请求数据 和赋值
            - 帮助OAuthVC 数据处理
 */
class HMOAuthViewModel: NSObject {
    // 全局访问点
    static let share: HMOAuthViewModel = HMOAuthViewModel()
    // 在沙盒中获取到保存用户数据的信息
    var userAccountModel: HMUserAccountModel?
    /// 抽取访问令牌(使用起来方便 因为token是有过期时间的 需要只要使用就需要判断是否过期)
    var accessToken: String?{
        
//        // 判断userAccountModel是否为nil
//        if userAccountModel == nil {
//            return nil
//        }else{
//            // 我们保存了数据了
//            // 需要判断是否过期  -> 不过期
//            if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending {
//                return userAccountModel?.access_token
//            }else{
//                // 过期
//                return nil
//            }
//        }
        // 抽取后
        if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending {
            return userAccountModel?.access_token
        }else{
            // 过期
            return nil
        }
    }
    
    // 判断用户是否登录
    var isLogin: Bool{
//        // 如果accessToken 有值 就是没有过期 - 登录状态
//        if accessToken != nil {
//            return true
//        }else{
//            // 如果为nil 就代表过期了 -> 未登录
//            return false
//        }
        return accessToken != nil
    }
    
    // 路径
    fileprivate let file = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! as NSString).appendingPathComponent("userAccount.archiver")
    // 重写init方法 完成userAccountModel 赋值
    override init() {
        super.init()
        // 因为单例的init方法只会走一次 所以只在沙盒取过一次数据
        userAccountModel = getUserAccountModel()
    }
}

// 帮助控制器请求数据
extension HMOAuthViewModel{
    // 请求UserAccount
    func getUserAccount(code: String, finish:@escaping (Bool)->()){
        
        HMNetworkTools.share.oauthLoadUserAccount(code: code, success: { (response) in
            // 判断response是否为nil 且是否是一个字典
            // guard let 和 if let 判断可选值不为nil 而且是否是我们想要的类型 需要配合as?使用 因为可选值 可能数据不能转成功
            guard let res = response as? [String: Any] else{
                finish(false)
                return
            }
            // 通过字典转模型
            let userAccountModel = HMUserAccountModel(dict: res)
            print(userAccountModel)
            // 继续请求个人信息数据
            self.getUserInfo(userAccountModel: userAccountModel, finish: finish)
        }) { (error) in
            print("失败",error)
            finish(false)
        }
    }
    
    // 请求UserInfo
    private func getUserInfo(userAccountModel: HMUserAccountModel, finish:@escaping (Bool)->()){
        HMNetworkTools.share.oauthLoadUserInfo(userAccountModel: userAccountModel, success: { (response) in
            // 判断response是否为nil 而且是否可以转成一个字典
            guard let res = response as? [String: Any] else{
                finish(false)
                return
            }
            // 直接赋值
            userAccountModel.screen_name = res["screen_name"] as? String
            userAccountModel.avatar_large = res["avatar_large"] as? String
            print(userAccountModel)
            // 通过归档和解档保存数据
            self.saveUserAccountModel(userAccountModel: userAccountModel)
            finish(true)
        }) { (error) in
            print(error,"失败")
            finish(false)
        }
    }
}
// 保存数据和获取数据
extension HMOAuthViewModel{
    /*  
        - 使用private修饰方法或者属性的时候 是只能在当前的作用域 不管是class 或者是extension 都是当前的作用域才可以使用private
        - 如果方法或者属性 需要在class 外 或者其它的extension中调用 但是还要保证这个方法或者属性外界不可以调用 需要使用fileprivate
     */
    // 保存数据
    fileprivate func saveUserAccountModel(userAccountModel: HMUserAccountModel){
        // 解决单例属性第一次没有值的bug 需要手动赋值
        self.userAccountModel = userAccountModel
        NSKeyedArchiver.archiveRootObject(userAccountModel, toFile: file)
    }
    // 获取数据
    func getUserAccountModel() -> HMUserAccountModel?{
        let result = NSKeyedUnarchiver.unarchiveObject(withFile: file) as? HMUserAccountModel
        return result
    }
}

